package br.com.sgmf.web.managedbean;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.sgmf.model.Funcionario;
import br.com.sgmf.model.Usuario;
import br.com.sgmf.service.FuncionarioService;
import br.com.sgmf.service.UsuarioService;

@Component
@ManagedBean
@RequestScoped
public class UsuarioBean {

	private static final String SENHAS_DIFERENTES = "Senhas diferentes";
	private static final String USUARIO_SALVO_COM_SUCESSO = "Usuario salvo com sucesso!";
	private static final String USUARIO_EXCLUIDO_COM_SUCESSO = "Usuário excluído com sucesso!";
	private static final String ERRO_AO_SALVAR_USUARIO = "Erro ao salvar Usuário";
	private static final String ERRO_AO_EXCLUIR_USUARIO = "Erro ao excluir Usuário";
	private static final String BUSCAR_FUNCIONARIO = "Necessário buscar funcionário";

	private Usuario usuario;
	private Funcionario funcionario;

	private List<Usuario> usuarios;
	private List<Funcionario> funcionarios;

	private String confirmarSenha;
	private String nomeFuncionario;

	@Autowired
	private UsuarioService usuarioService;

	@Autowired
	private FuncionarioService funcionarioService;

	@PostConstruct
	public void inicializar() {
		usuario = new Usuario();
		funcionario = new Funcionario();
		usuarios = usuarioService.findAll();
		funcionarios = null;
		nomeFuncionario = null;
		confirmarSenha = null;
	}

	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message;

		if (funcionario != null) {
			if (usuario.getSenha().equals(confirmarSenha)) {
				try {
					usuarioService.saveOrUpdate(usuario, funcionario);
					message = new FacesMessage(FacesMessage.SEVERITY_INFO,
							USUARIO_SALVO_COM_SUCESSO, null);
					inicializar();
				} catch (Exception e) {
					message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
							ERRO_AO_SALVAR_USUARIO, null);
					e.printStackTrace();
				}
			} else {
				message = new FacesMessage(FacesMessage.SEVERITY_WARN,
						SENHAS_DIFERENTES, null);
			}
		} else {
			message = new FacesMessage(FacesMessage.SEVERITY_WARN,
					BUSCAR_FUNCIONARIO, null);
		}

		context.addMessage(null, message);
		return null;
	}

	public void novo() {
		usuario = new Usuario();
		funcionario = new Funcionario();
		nomeFuncionario = null;
		confirmarSenha = null;
	}

	public String editar(Usuario usuario) {
		this.usuario = usuario;
		return null;
	}

	public String excluir(Usuario usuario) {
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage message;

		try {
			usuarioService.delete(usuario);
			message = new FacesMessage(FacesMessage.SEVERITY_INFO,
					USUARIO_EXCLUIDO_COM_SUCESSO, null);
			inicializar();
		} catch (Exception e) {
			message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					ERRO_AO_EXCLUIR_USUARIO, null);
			e.printStackTrace();
		}

		context.addMessage(null, message);
		return null;
	}

	public List<Funcionario> buscarFuncionario() {
		funcionarios = funcionarioService.findAllByNome(nomeFuncionario);
		nomeFuncionario = null;
		return funcionarios;
	}

	public void adicionarFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public List<Funcionario> getFuncionarios() {
		return funcionarios;
	}

	public void setFuncionarios(List<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}

	public String getConfirmarSenha() {
		return confirmarSenha;
	}

	public void setConfirmarSenha(String confirmarSenha) {
		this.confirmarSenha = confirmarSenha;
	}

	public String getNomeFuncionario() {
		return nomeFuncionario;
	}

	public void setNomeFuncionario(String nomeFuncionario) {
		this.nomeFuncionario = nomeFuncionario;
	}

	public UsuarioService getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

	public FuncionarioService getFuncionarioService() {
		return funcionarioService;
	}

	public void setFuncionarioService(FuncionarioService funcionarioService) {
		this.funcionarioService = funcionarioService;
	}

}
